/* eslint-disable */
/**
 * 用于安全取用对象键值
 * @param {*} obj 取值对象
 * @param {*} keyStr 索引字符串,结构'b.c',则获取obj.b.c
 * @param {*} dft 默认返回的值，当没有成功取值时或得到的值为null或undefined时
 */
export function safeValue(obj, keyStr = '', dft) {
  if (Object.prototype.toString.call(obj) === '[object Object]') {
    if (keyStr) {
      if (keyStr.indexOf('.') < 0) {
        const res = obj[keyStr];
        return isNullOrUdf(res) ? dft : res;
      }
      const key = keyStr.split('.')[0];
      const resetKeyStr = keyStr.substr(key.length + 1);
      if (key in obj) {
        return safeValue(obj[key], resetKeyStr, dft);
      }
      return dft;
    }
    return dft;
  }
  return dft;
}

/**
 * 提交表单去掉空字段
 * @param {*} fieldsValue
 */
export const exceptSpace = fieldsValue => {
  const currentValue = {
    ...fieldsValue,
  };

  Object.keys(currentValue).map(item => {
    if (
      currentValue[item] === undefined ||
      currentValue[item] === '' ||
      currentValue[item] === null
    ) {
      delete currentValue[item];
    }
  });
  return currentValue;
};

export function isNullOrUdf(obj) {
  return obj === undefined || obj === null;
}

/**
 * @description: 生成唯一哈希值
 * @param {string} str 字符串
 * @param {boolean} caseSensitive 对大小写是否敏感
 */
export function getHashCode(str, caseSensitive) {
  if (!caseSensitive) {
    str = str.toLowerCase();
  }
  let hash = 1315423911;
  let i;
  let ch;
  for (i = str.length - 1; i >= 0; i--) {
    ch = str.charCodeAt(i);
    hash ^= (hash << 5) + ch + (hash >> 2);
  }
  return hash & 0x7fffffff;
}

// 函数防抖的实现
export function getType(value: any): string {
  // 判断数据是 null 的情况
  if (value === null) {
    return `${value}`;
  }
  // 判断数据是引用类型的情况
  if (typeof value === 'object') {
    const valueClass = Object.prototype.toString.call(value);
    const type = valueClass.split(' ')[1].split('');
    type.pop();
    return type.join('').toLowerCase();
  }
  // 判断数据是基本数据类型的情况和函数的情况
  return typeof value;
}
